//相同的树
/*给你两棵二叉树的根节点 p 和 q ，编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同，并且节点具有相同的值，则认为它们是相同的。*/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
    bool f = true;

public:
    void dfs(TreeNode* proot, TreeNode* qroot) {
        if (proot == nullptr && qroot != nullptr) {
            f = false;
            return;
        } else if (proot != nullptr && qroot == nullptr) {
            f = false;
            return;
        } else if (proot == nullptr && qroot == nullptr) {
            return;
        } else if (proot->val != qroot->val) {
            f = false;
            return;
        }
        dfs(proot->left, qroot->left);
        dfs(proot->right, qroot->right);
    }
    bool isSameTree(TreeNode* p, TreeNode* q) {
        dfs(p, q);
        return f;
    }
};


//翻转二叉树
/*给定一棵二叉树的根节点 root，请左右翻转这棵二叉树，并返回其根节点。*/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
public:
    void dfs(TreeNode* root) {
        if (root == nullptr)
            return;
        dfs(root->left);
        dfs(root->right);
        swap(root->left, root->right);
    }
    TreeNode* flipTree(TreeNode* root) {
        dfs(root);
        return root;
    }
};